﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using SeguradoraIA.Diagrama;

namespace SeguradoraIA.Business
{
    public class PerceptronCODE
    {
        SeguradoraIAEntities ctx = new SeguradoraIAEntities();
        public string[] name { get { return new string[] { "IdBairro", "IdCursoFormacao", "IdGrauInstrucao", "IdIdade", "IdMarcaCarro", "IdProfissao", "IdSinistro", "IdTempoHabilitacao", "IdTipoCarro", "IdValorCarro", "Limiar" };}}
        //w => peso
        //d => resultado esperado
        //y => saída
        //n => taxa de aprendizagem
        public void neuronio(ref double[] peso, ref int[] desejado, ref double[] saida, double taxaAprendizagem, DataTable dados)
        {
            TimeSpan tempo = DateTime.Now.TimeOfDay;

            int i, j;
            //Calculos do neurônio
            for (i = 0; i < desejado.Length; i++)
            {
                calculo_neuronio(ref peso, ref saida, i, dados);
                if (saida[i] != desejado[i])
                {
                    //Treinamento
                    treinar(i, taxaAprendizagem, ref desejado, ref saida, ref peso, dados);
                    i = -1;
                }
            }

            tempo = DateTime.Now.TimeOfDay - tempo;
        }

        public void treinar(int i, double taxaAprendizagem, ref int[] desejado, ref double[] saida, ref double[] peso, DataTable dados)
        {
            int cont;

            for (cont = 0; cont < peso.Length; cont++)
            {
                peso[cont] = peso[cont] + taxaAprendizagem * (desejado[i] - saida[i]) * Convert.ToDouble(dados.Rows[i][name[cont]]);
            }
        }

        public void calculo_neuronio(ref double[] peso, ref double[] saida, int i, DataTable dados)
        {
            int j;
            saida[i] = 0;

            for (j = 0; j < peso.Length; j++)
            {
                saida[i] += Convert.ToDouble(dados.Rows[i][name[j]]) * peso[j];
            }
            if (saida[i] >= 0)
            {
                saida[i] = 1;
            }
            else
            {
                saida[i] = -1;
            }
        }

        public double[] RecuperarArrayPeso()
        {
            Peso peso = ctx.Peso.FirstOrDefault();

            if (peso == null)
                return null;

            List<double> listaPeso = new List<double>()
            {
                peso.PesoBairro,
                peso.PesoCursoFormacao,
                peso.PesoGrauInstrucao,
                peso.PesoIdade,
                peso.PesoMarcaCarro,
                peso.PesoProfissao,
                peso.PesoSinistro,
                peso.PesoTempoHabilitacao,
                peso.PesoTipoCarro,
                peso.PesoValorCarro,
            };
            return listaPeso.ToArray();
        }
    }
}